package org.douxiaoban.client.activity;

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.mobclick.android.MobclickAgent;
import com.zxing.decoding.camera.CameraManager;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.zxing.decoding.decoding.CaptureActivityHandler;
import com.zxing.decoding.decoding.InactivityTimer;
import com.zxing.decoding.view.ViewfinderView;
import org.douxiaoban.client.R;
import org.douxiaoban.client.api.SubjectRecord;
import org.douxiaoban.client.app.Assistant;
import org.douxiaoban.client.util.ThreadTool;

import java.io.IOException;
import java.util.Vector;


public class CaptureActivity extends Activity implements Callback {

	private CaptureActivityHandler handler;
	private ViewfinderView viewfinderView;
	private boolean hasSurface;
	private Vector<BarcodeFormat> decodeFormats;
	private String characterSet;
	private TextView txtResult;
    private TextView txtSummary;
	private InactivityTimer inactivityTimer;
	private MediaPlayer mediaPlayer;
	private boolean playBeep;
	private static final float BEEP_VOLUME = 0.10f;
	private boolean vibrate;
    private ImageView flashSwitchImage;
    private boolean hadFalsh = false;

    private ImageView resultImageView;
    private ImageView bookImageView;
    private Button forwardBookPageBtn;
    private Button repateCaptureBtn;

    ThreadTool threadTool;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.capture);
 		CameraManager.init(getApplication());

		viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
		txtResult = (TextView) findViewById(R.id.txtResult);
        txtSummary = (TextView)findViewById(R.id.txtSummary);
        flashSwitchImage = (ImageView)findViewById(R.id.flash_switch_image);
        bookImageView = (ImageView)findViewById(R.id.book_image_view);
        resultImageView = (ImageView)findViewById(R.id.result_image_view);
        forwardBookPageBtn = (Button)findViewById(R.id.forward_book_btn);
        repateCaptureBtn = (Button)findViewById(R.id.repate_capture_btn);
		hasSurface = false;
		inactivityTimer = new InactivityTimer(this);
        flashSwitchImage.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                if(!hadFalsh){
                    CameraManager.get().enableFlashLight();
                    flashSwitchImage.setImageResource(R.drawable.light_yellow);
                    hadFalsh = true;
                }else{
                    CameraManager.get().disableFlashLight();
                    flashSwitchImage.setImageResource(R.drawable.light_bulb);
                    hadFalsh = false;
                }
            }
        });

        repateCaptureBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
              hiddenSufferView();
            }
        });
	}

	@Override
	protected void onResume() {
		super.onResume();
		SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (hasSurface) {
			initCamera(surfaceHolder);
		} else {
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		decodeFormats = null;
		characterSet = null;

		playBeep = true;
		AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			playBeep = false;
		}
		initBeepSound();
		vibrate = true;

        MobclickAgent.onResume(this);
	}

	@Override
	protected void onPause() {
		super.onPause();

        MobclickAgent.onPause(this);
		if (handler != null) {
			handler.quitSynchronously();
			handler = null;
		}
		CameraManager.get().closeDriver();
	}

	@Override
	protected void onDestroy() {
		inactivityTimer.shutdown();
		super.onDestroy();
	}

	private void initCamera(SurfaceHolder surfaceHolder) {
		try {
			CameraManager.get().openDriver (surfaceHolder);
		} catch (IOException ioe) {
			return;
		} catch (RuntimeException e) {
			return;
		}
		if (handler == null) {
			handler = new CaptureActivityHandler(this, decodeFormats,
					characterSet);
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (!hasSurface) {
			hasSurface = true;
			initCamera(holder);
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		hasSurface = false;

	}

	public ViewfinderView getViewfinderView() {
		return viewfinderView;
	}

	public Handler getHandler() {
		return handler;
	}

	public void drawViewfinder() {
		viewfinderView.drawViewfinder();

	}

      private Handler subjectHandler = new Handler (){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case Assistant.FETCH_SUBJECT_DONE:
                    Bundle bundle = msg.getData();
                   SubjectRecord subjectRecord =
                           (SubjectRecord)bundle.getSerializable(Assistant.KEY_OF_SUBJECT);
                    Log.e("Thread",subjectRecord.icon_url);

                    threadTool.startThreadImageDownload(Assistant.STATUS_BOOK_READING,
                            subjectRecord.icon_url.replaceFirst("spic","lpic"),subjectHandler,1);
                    break;
                case Assistant.FETCH_SUBJECT_FAIL:
                    break;

                case Assistant.FETCH_BOOK_READING_IMAGE_DONE:
                    Bundle imageData = msg.getData();

                    ThreadTool.ImageSerialz is = (ThreadTool.ImageSerialz)imageData.
                            getSerializable(Assistant.THREAD_IMAGE_KEY);

                    Log.e("Thread","image");
                    updateBookImage(is.m_bitmap);
                    break;

            }
        }
    };

    private void updateBookImage(Bitmap bitmap){
        findViewById(R.id.loading_image_tx).setVisibility(View.GONE);
        bookImageView.setImageBitmap(bitmap);
        bookImageView.setVisibility(View.VISIBLE);
    }

    private void hiddenSufferView(){
        Intent intent = new Intent(CaptureActivity.this,CaptureActivity.class);
        startActivity(intent);
        finish();

//        viewfinderView.setVisibility(View.VISIBLE);
//        flashSwitchImage.setVisibility(View.VISIBLE);
//        this.findViewById(R.id.result_view_lay).setVisibility(View.GONE);
//        this.findViewById(R.id.loading_image_tx).setVisibility(View.VISIBLE);
//        bookImageView.setVisibility(View.GONE);
//        hasSurface = false;

    }

	public void handleDecode(final Result obj, Bitmap barcode) {
		inactivityTimer.onActivity();
		//viewfinderView.drawResultBitmap(barcode);
        viewfinderView.setVisibility(View.GONE);
        this.findViewById(R.id.result_view_lay).setVisibility(View.VISIBLE);
        resultImageView.setImageBitmap(barcode);

		 playBeepSoundAndVibrate();
		txtResult.setText(getString(R.string.capture_success)+ "ISBN:"
				+ obj.getText());
        flashSwitchImage.setVisibility(View.GONE);
        txtSummary.setVisibility(View.GONE);
        forwardBookPageBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra(Assistant.KEY_OF_INTENT_CATEGORY, Assistant.STATUS_BOOK);
                intent.putExtra(Assistant.KEY_OF_ISBN, obj.getText());
                intent.setClass(CaptureActivity.this, CollectionSubjectActivity.class);
                startActivity(intent);
                finish();
            }
        });

       threadTool  = new ThreadTool(this);

       threadTool.startThreadFetchSubject(null, obj.getText(), Assistant.STATUS_BOOK, subjectHandler);
	}



	private void initBeepSound() {
		if (playBeep && mediaPlayer == null) {
			// The volume on STREAM_SYSTEM is not adjustable, and users found it
			// too loud,
			// so we now play on the music stream.
			setVolumeControlStream(AudioManager.STREAM_MUSIC);
			mediaPlayer = new MediaPlayer();
			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			mediaPlayer.setOnCompletionListener(beepListener);

			AssetFileDescriptor file = getResources().openRawResourceFd(
					R.raw.beep);
			try {
				mediaPlayer.setDataSource(file.getFileDescriptor(),
						file.getStartOffset(), file.getLength());
				file.close();
				mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
				mediaPlayer.prepare();
			} catch (IOException e) {
				mediaPlayer = null;
			}
		}
	}

	private static final long VIBRATE_DURATION = 200L;

	private void playBeepSoundAndVibrate() {
		if (playBeep && mediaPlayer != null) {
			mediaPlayer.start();
		}
		if (vibrate) {
			Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
			vibrator.vibrate(VIBRATE_DURATION);
		}
	}

	/**
	 * When the beep has finished playing, rewind to queue up another one.
	 */
	private final OnCompletionListener beepListener = new OnCompletionListener() {
		public void onCompletion(MediaPlayer mediaPlayer) {
			mediaPlayer.seekTo(0);
		}
	};




}